iT邦幫忙

2021 iThome 鐵人賽

DAY 18
0
Software Development

C++ 三十天學習紀錄系列 第 18

【Day 18】Complexity & Graphs

  • 分享至 

  • xImage
  •  

接下來我們要針對複雜度做介紹,首先要說的就是高手們常常說的「Big O」! 但是到底什麼是 big O notation 呢?

Big O

在電腦科學中,big O 可以幫助我們分析演算法效率:
https://chart.googleapis.com/chart?cht=tx&chl=f(n)%20%5Cge%200, https://chart.googleapis.com/chart?cht=tx&chl=g(n)%20%5Cge%200,且存在一正數 C 與一數 N 使得 https://chart.googleapis.com/chart?cht=tx&chl=f(n)%20%5Cle%20c%20%5Ctimes%20g(n) for all https://chart.googleapis.com/chart?cht=tx&chl=n%20%5Cge%20N ,則 https://chart.googleapis.com/chart?cht=tx&chl=f(n)%20%5Cin%20O(g(n))
也就是說,當 n 夠大時,g(n) 的影響力會比 f(n) 大。

舉個例子:



可以發現,在計算 Big O 時,我們是忽略掉常數項不計的。

Graphs / Networks

nodesedges 交織而成。
nodes 可以理解為一個點的位置,而 edges 則是通往別的點的路徑,與兩點中間若有 edge,即稱這兩個點為 neighbors,而一個 node 有多少 neighbor 就代表他有多少 degree。

Edges有兩個種類:

  1. Directed edges:記為 (u, v)。
  2. Undirected edges:記為 [u, v]。
    以上圖為例,因上圖相接的 edge 是沒有方向性的,像是 [1, 2] = [2, 1],因此上圖為一 undirected graph。

Path
path 又稱為 route,以上圖為例:若我們想要從 node1 走到 node6,我們有好幾種方式:
(1, 5, 4, 6)、(1, 2 ,3 ,4, 6)、(1, 3, 4, 6)。

Cycle
若ㄧ路徑起點與終點相同,則我們稱此為一個 cycle。
一個不含 cycle 的path稱作「simple path」。
一個不含 cycle的graph稱作「acyclic graph」。

Weights
我們可以在每條 edge 上添加上數字,代表 distance、cost 等等。
例如:

(1, 2, 3, 4) 的距離即為13。

Adjacency matrix & Adjacency list

由於在程式碼不能讀取我們的圖,但是可以用adjacency matrix來儲存graph的資訊,不過有的時候,adjacency matrix會太佔空間,因此也很常用另一種方式:adjacency list。

如果我們想要存誰是neighbors,只要是 neighbors 就在 matrix 中以 1 表示。

Graph algorithms

一個 graph 可以表達很多資訊,例如我們想找到各點的最短路徑的話,可以將所有最短路徑畫成一個樹狀圖如下圖。

而依照此樹狀圖,有兩種演算法可以幫助我們做搜尋 nodes,分別為:

  1. Breadth-first search (BFS) 廣度優先
  2. Depth-first search (DFS) 深度優先

這邊有一篇文章我認為講得十分清楚,附上網址給大家做參考:深度優先搜尋(DFS)和廣度優先搜尋(BFS)演算法,實用的節點搜尋法


上一篇
【Day 17】Algorithm & Recursion 演算法 & 遞迴
下一篇
【Day 19】Algorithm - Practice 1
系列文
C++ 三十天學習紀錄30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言